// 文件路径: dbms/ui/GuiApplication.java
package com.dbms.ui;

import com.dbms.service.IDbmsService;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * JavaFX GUI应用的主入口类
 * 核心职责：
 * 1. 初始化并显示登录窗口，作为用户进入系统的第一个界面
 * 2. 依赖 {@link IDbmsService} 接口实现数据库交互（解耦本地/远程服务）
 * 3. 处理登录逻辑：验证用户身份，成功后跳转至主功能窗口（{@link MainStage}）
 *
 * 【已修改】设计亮点：
 * - 不直接依赖具体的 {@link com.dbms.DbmsCore} 实现，而是通过 {@link IDbmsService} 接口接收服务注入
 * - 支持两种服务模式：本地服务（直接操作本地数据库文件）和远程服务（连接远程DBMS服务器）
 */
public class GuiApplication extends Application {

    /**
     * 静态数据库服务实例：由外部启动器（如 {@link com.dbms.Launcher}）注入
     * 作用：封装数据库操作（认证、SQL执行等），屏蔽本地/远程服务的实现差异
     */
    private static IDbmsService dbmsService;

    /**
     * 外部服务注入入口方法
     * 由启动器（如 {@link com.dbms.Launcher}）调用，根据用户选择的模式（本地/客户端）注入对应服务
     * @param service 数据库服务实例（本地服务 {@link com.dbms.service.LocalDbmsService} 或远程服务 {@link com.dbms.service.RemoteDbmsService}）
     */
    public static void setDbmsService(IDbmsService service) {
        dbmsService = service;
    }

    /**
     * JavaFX应用的核心入口方法：初始化并显示登录窗口
     * 负责UI布局构建、组件绑定和登录事件处理
     * @param primaryStage 登录窗口的主舞台（JavaFX的顶层容器）
     */
    @Override
    public void start(Stage primaryStage) {
        // 1. 设置登录窗口标题
        primaryStage.setTitle("DBMS 登录");

        // 2. 构建布局容器：GridPane用于对齐表单组件，VBox用于组合标题和表单
        // GridPane：表格布局，控制用户名、密码输入框的对齐和间距
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER); // 布局整体居中
        grid.setHgap(10); // 列之间的水平间距（10像素）
        grid.setVgap(12); // 行之间的垂直间距（12像素）
        grid.setPadding(new Insets(25, 25, 25, 25)); // 内边距（上、右、下、左）

        // 3. 构建UI组件
        // 标题标签（系统名称）
        Label title = new Label("数据库管理系统");
        title.getStyleClass().add("login-title"); // 绑定CSS样式类，美化标题

        // 用户名标签和输入框
        Label userNameLabel = new Label("用户名:");
        TextField userTextField = new TextField();
        userTextField.setPromptText("默认为 admin"); // 输入提示
        userTextField.setText("admin"); // 默认填充用户名（提升用户体验）

        // 密码标签和密码输入框（密码输入时隐藏明文）
        Label pwLabel = new Label("密码:");
        PasswordField pwBox = new PasswordField();
        pwBox.setPromptText("默认为 admin"); // 输入提示
        pwBox.setText("admin"); // 默认填充密码（提升用户体验）

        // 登录按钮
        Button loginButton = new Button("登录");
        // 错误提示标签（初始为空，登录失败时显示错误信息）
        Label errorLabel = new Label();
        errorLabel.getStyleClass().add("error-label"); // 绑定CSS样式类，错误信息红色显示

        // 4. 组装布局：将组件添加到GridPane和VBox中
        grid.add(userNameLabel, 0, 0); // 用户名标签：第0列第0行
        grid.add(userTextField, 1, 0); // 用户名输入框：第1列第0行
        grid.add(pwLabel, 0, 1);       // 密码标签：第0列第1行
        grid.add(pwBox, 1, 1);         // 密码输入框：第1列第1行
        grid.add(loginButton, 1, 2);   // 登录按钮：第1列第2行（靠右对齐）
        grid.add(errorLabel, 1, 3);    // 错误提示：第1列第3行

        // VBox：垂直布局，组合标题和表单（标题在上，表单在下）
        VBox vbox = new VBox(20, title, grid);
        vbox.setAlignment(Pos.CENTER); // 垂直布局整体居中
        vbox.setPadding(new Insets(20)); // 整体内边距

        // 5. 绑定登录按钮点击事件（核心登录逻辑）
        loginButton.setOnAction(e -> {
            // 5.1 获取用户输入的用户名和密码
            String username = userTextField.getText().trim();
            String password = pwBox.getText().trim();

            // 5.2 输入校验：用户名或密码为空时提示错误
            if (username.isEmpty() || password.isEmpty()) {
                errorLabel.setText("用户名和密码不能为空！");
                return; // 终止后续逻辑
            }

            // 5.3 服务校验：检查服务是否已注入（防止空指针异常）
            if (dbmsService == null) {
                errorLabel.setText("错误：数据库服务未初始化！");
                return; // 终止后续逻辑
            }

            // 5.4 【关键修改】调用服务接口的认证方法，而非直接依赖DbmsCore
            // 解耦设计：无论本地还是远程服务，统一通过IDbmsService.authenticate验证
            boolean isAuthenticated = dbmsService.authenticate(username, password);

            // 5.5 处理认证结果
            if (isAuthenticated) {
                // 认证成功：关闭登录窗口，打开主功能窗口
                System.out.println("Login successful for user: " + username);
                primaryStage.close(); // 关闭当前登录窗口

                // 创建并显示主功能窗口，传入已认证的服务实例
                MainStage mainStage = new MainStage(dbmsService);
                mainStage.show();

            } else {
                // 认证失败：显示错误信息（用户名或密码错误）
                errorLabel.setText("用户名或密码错误！");
            }
        });

        // 6. 构建场景并设置到舞台
        Scene scene = new Scene(vbox, 400, 350); // 场景大小：宽400像素，高350像素
        // 加载CSS样式文件（美化UI）
        try {
            scene.getStylesheets().add(getClass().getResource("/style.css").toExternalForm());
        } catch (NullPointerException e) {
            // CSS文件缺失时打印警告（不影响功能，仅UI样式降级）
            System.err.println("Warning: CSS file '/style.css' not found. UI may not be styled correctly.");
        }
        primaryStage.setScene(scene); // 将场景设置到舞台
        primaryStage.setResizable(false); // 禁止窗口大小调整（保证UI布局一致性）
        primaryStage.show(); // 显示登录窗口
    }

    /**
     * 本地测试入口：仅用于UI组件的快速调试
     * 注意：项目正式启动入口为 {@link com.dbms.Launcher}，此方法仅用于开发测试
     * @param args 命令行参数（未使用）
     */
    public static void main(String[] args) {
        // 测试时可临时注入本地服务（正式环境由Launcher注入）
        // setDbmsService(new com.dbms.service.LocalDbmsService());
        launch(args); // 启动JavaFX应用，触发start()方法
    }
}